<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="utf-8">
  
  <title>tcp-ip | JAVA</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  
  <meta name="keywords" content="计算机网络">
  
  
  
  
  <meta name="description" content="OSI标准模型OSI标准模型是7层架构  ​      应用层: 应用层是OSI标准模型的最顶层,是直接为应用进程提供服务。其作用在实现多个系统应用进程相互通信的同时，完成一系列业务处理所需要的服务。包括文件传输、电子邮件远程登录和远程接口调用等协议。 表示层: 表示层向上对应用服务，向下接收会话层提供的服务，表示层位于OSI标准模型的第六层，表示层的主要作用就是将设备的固有数据格式转换为网络标准">
<meta name="keywords" content="计算机网络">
<meta property="og:type" content="article">
<meta property="og:title" content="TCP-IP">
<meta property="og:url" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/index.html">
<meta property="og:site_name" content="JAVA">
<meta property="og:description" content="OSI标准模型OSI标准模型是7层架构  ​      应用层: 应用层是OSI标准模型的最顶层,是直接为应用进程提供服务。其作用在实现多个系统应用进程相互通信的同时，完成一系列业务处理所需要的服务。包括文件传输、电子邮件远程登录和远程接口调用等协议。 表示层: 表示层向上对应用服务，向下接收会话层提供的服务，表示层位于OSI标准模型的第六层，表示层的主要作用就是将设备的固有数据格式转换为网络标准">
<meta property="og:locale" content="zh-CN">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214100223229.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214100620029.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214110541195.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214110803250.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214111803331.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214112827717.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201215101315110.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214115539456.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214135505549.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214135909598.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214141613712.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214142941374.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214161849711.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214162007978.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214164505242.png">
<meta property="og:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214164638295.png">
<meta property="og:updated_time" content="2020-12-15T02:15:48.462Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="TCP-IP">
<meta name="twitter:description" content="OSI标准模型OSI标准模型是7层架构  ​      应用层: 应用层是OSI标准模型的最顶层,是直接为应用进程提供服务。其作用在实现多个系统应用进程相互通信的同时，完成一系列业务处理所需要的服务。包括文件传输、电子邮件远程登录和远程接口调用等协议。 表示层: 表示层向上对应用服务，向下接收会话层提供的服务，表示层位于OSI标准模型的第六层，表示层的主要作用就是将设备的固有数据格式转换为网络标准">
<meta name="twitter:image" content="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214100223229.png">
  
    <link rel="alternate" href="/atom.xml" title="JAVA" type="application/atom+xml">
  

  

  <link rel="icon" href="/css/images/mylogo.jpg">
  <link rel="apple-touch-icon" href="/css/images/mylogo.jpg">
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  <link href="https://fonts.googleapis.com/css?family=Open+Sans|Montserrat:700" rel="stylesheet" type="text/css">
  <link href="https://fonts.googleapis.com/css?family=Roboto:400,300,300italic,400italic" rel="stylesheet" type="text/css">
  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
  <style type="text/css">
    @font-face{font-family:futura-pt; src:url("/css/fonts/FuturaPTBold.otf") format("woff");font-weight:500;font-style:normal;}
    @font-face{font-family:futura-pt-light; src:url("/css/fonts/FuturaPTBook.otf") format("woff");font-weight:lighter;font-style:normal;}
    @font-face{font-family:futura-pt-italic; src:url("/css/fonts/FuturaPTBookOblique.otf") format("woff");font-weight:400;font-style:italic;}
}

  </style>
  <link rel="stylesheet" href="/css/style.css">

  <script src="/js/jquery-3.1.1.min.js"></script>
  <script src="/js/bootstrap.js"></script>

  <!-- Bootstrap core CSS -->
  <link rel="stylesheet" href="/css/bootstrap.css">

  
    <link rel="stylesheet" href="/css/dialog.css">
  

  

  
    <link rel="stylesheet" href="/css/header-post.css">
  

  
  
  
    <link rel="stylesheet" href="/css/vdonate.css">
  

</head>
</html>


  <body data-spy="scroll" data-target="#toc" data-offset="50">


  
  <div id="container">
    <div id="wrap">
      
        <header>

    <div id="allheader" class="navbar navbar-default navbar-static-top" role="navigation">
        <div class="navbar-inner">
          
          <div class="container"> 
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
              <span class="sr-only">Toggle navigation</span>
              <span class="icon-bar"></span>
              <span class="icon-bar"></span>
              <span class="icon-bar"></span>
            </button>

            
              <a class="brand" style="border-width: 0;">
                <p>JAVA</p>
              </a>
            
            
            <div class="navbar-collapse collapse">
              <ul class="hnav navbar-nav">
                
                  <li> <a class="main-nav-link" href="/">首页</a> </li>
                
                  <li> <a class="main-nav-link" href="/archives">归档</a> </li>
                
                  <li> <a class="main-nav-link" href="/categories">分类</a> </li>
                
                  <li> <a class="main-nav-link" href="/tags">标签</a> </li>
                
                  <li> <a class="main-nav-link" href="/about">关于</a> </li>
                
                  <li><div id="search-form-wrap">

    <form class="search-form">
        <input type="text" class="ins-search-input search-form-input" placeholder>
        <button type="submit" class="search-form-submit"></button>
    </form>
    <div class="ins-search">
    <div class="ins-search-mask"></div>
    <div class="ins-search-container">
        <div class="ins-input-wrapper">
            <input type="text" class="ins-search-input" placeholder="请输入关键词...">
            <span class="ins-close ins-selectable"><i class="fa fa-times-circle"></i></span>
        </div>
        <div class="ins-section-wrapper">
            <div class="ins-section-container"></div>
        </div>
    </div>
</div>
<script>
(function (window) {
    var INSIGHT_CONFIG = {
        TRANSLATION: {
            POSTS: '文章',
            PAGES: '页面',
            CATEGORIES: '分类',
            TAGS: '标签',
            UNTITLED: '(无标题)',
        },
        ROOT_URL: '/',
        CONTENT_URL: '/content.json',
    };
    window.INSIGHT_CONFIG = INSIGHT_CONFIG;
})(window);
</script>
<script src="/js/insight.js"></script>

</div></li>
            </ul></div>
          </div>
                
      </div>
    </div>

</header>



      
            
      <div id="content" class="outer">
        
          <section id="main" style="float:none;"><article id="post-TCP-IP" style="width: 75%; float:left;" class="article article-type-post" itemscope itemprop="blogPost">
  <div id="articleInner" class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="thumb" itemprop="name">
      TCP-IP
    </h1>
  

      </header>
    
    <div class="article-meta">
      
	<a href="/2020/12/14/TCP-IP/" class="article-date">
	  <time datetime="2020-12-14T01:47:40.000Z" itemprop="datePublished">2020-12-14</time>
	</a>

      
    <a class="article-category-link" href="/categories/计算机网络/">计算机网络</a>

      
	<a class="article-views">
	<span id="busuanzi_container_page_pv">
		阅读量<span id="busuanzi_value_page_pv"></span>
	</span>
	</a>

      

    </div>
    <div class="article-entry" itemprop="articleBody">
      
        <h2 id="OSI标准模型"><a href="#OSI标准模型" class="headerlink" title="OSI标准模型"></a>OSI标准模型</h2><p>OSI标准模型是7层架构</p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214100223229.png" alt="image-20201214100223229"></p>
<p>​    <img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214100620029.png" alt="image-20201214100620029"></p>
<ul>
<li><strong>应用层</strong>: 应用层是OSI标准模型的最顶层,是直接为应用进程提供服务。其作用在实现多个系统应用进程相互通信的同时，完成一系列业务处理所需要的服务。包括文件传输、电子邮件远程登录和远程接口调用等协议。</li>
<li><strong>表示层</strong>: 表示层向上对应用服务，向下接收会话层提供的服务，表示层位于OSI标准模型的第六层，表示层的主要作用就是将设备的固有数据格式转换为网络标准传输格式。</li>
<li><strong>会话层</strong>: 会话层位于OSI标准模型的第五层，它是建立在传输层之上，利用传输层提供的服务建立和维持会话。</li>
<li><strong>传输层</strong>: 传输层为上面的应用层提供通讯服务,负责将上层数据分段并提供端到端的,可靠（TCP）或者不可靠（UDP）的传输，以及端到端的差错控制和流量控制</li>
<li><strong>网络层</strong>: 实现两个端系统之间的数据透明传送，具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术。（协议：IP、ICMP协议、ARR、RAPP协议，设备: 路由器）</li>
<li><strong>链路层</strong>: 最基本服务是将来自网络层的数据可靠传输到相临节点的目标机（协议：以太网协议，设备：网桥和交换机）</li>
<li><strong>物理层</strong>: 为上层提供了一个传输数据可靠的物理媒介</li>
</ul>
<h2 id="TCP-IP体系"><a href="#TCP-IP体系" class="headerlink" title="TCP/IP体系"></a>TCP/IP体系</h2><p>TCP/IP协议说的不仅仅只是TCP/IP这两种协议、TCP/IP指的协议簇，简单来说就是一系列协议的综合</p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214110541195.png" alt="image-20201214110541195"></p>
<p>  TCP/IP 协议是我们程序员接触最多的协议，OSI 模型共有七层，从下到上分别是物理层、数据链路层、网络层、运输层、会话层、表示层和应用层。但是这显然是有些复杂的，所以在 TCP/IP 协议中，它们被简化为了四个层次</p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214110803250.png" alt="image-20201214110803250"></p>
<h3 id="各层定义"><a href="#各层定义" class="headerlink" title="各层定义"></a>各层定义</h3><h4 id="通信链路层"><a href="#通信链路层" class="headerlink" title="通信链路层"></a>通信链路层</h4><p>通信链路层包括物理层和链路层</p>
<h4 id="网络层"><a href="#网络层" class="headerlink" title="网络层"></a>网络层</h4><p><strong>实现两个端系统之间的数据传送，具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术。</strong></p>
<p><strong>提供两种服务</strong></p>
<ul>
<li><p><strong>虚电路服务</strong></p>
<p>虚电路表示只是一条逻辑上的链接，分组都沿着这条逻辑链接按照存储转发的方式发送，而不是真正建立了一个物理连接。</p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214111803331.png" alt="image-20201214111803331"></p>
</li>
<li><p><strong>数据报服务</strong></p>
<p>提供简单灵活、无连接、尽最大努力交付的数据报服务</p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214112827717.png" alt="image-20201214112827717"></p>
</li>
</ul>
<p><strong>包括协议</strong></p>
<ul>
<li><p><strong>IP协议(Internet Protocol,因特网协议)</strong></p>
<p>IP地址由四段组成，每个字段是一个字节，8位，最大值是255</p>
<p>IP地址由两部分组成，即网络地址和主机地址。网络地址表示其属于互联网的哪一个网络，主机地址表示其属于该网络中的哪一台主机。二者是主从关系。</p>
<p>IP地址的四大类型标识的是网络中的某台主机。IPv4的地址长度为32位，共4个字节，但实际中我们用<a href="http://baike.baidu.com/view/828066.htm" target="_blank" rel="noopener">点分十进制</a>记法。</p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201215101315110.png" alt="image-20201215101315110"></p>
<p>IP地址根据网络号和主机号来分,分为A、B、C、三类及特殊地址D、E。全0和全1都不保留不用。</p>
<p>A类：1.0.0.0 ~ 127.255.255.255        私有：10.0.0.0~10.255.255.255</p>
<p>B类：128.0.0.0 ~ 191.255.255.255    私有：172.16.0.0～172.31.255.255 </p>
<p>C类：192.0.0.0~ 223.255.255.255     私有：192.168.0.0~192.168.255.255</p>
<p>D类：224.0.0.0 ~ 239.255.255.255</p>
<p>E类：240.0.0.0~247.255.255.255</p>
<p>回环地址：127.0.0.0/8被用作回环地址，回环地址表示本机的地址，常用于对本机的测试，用的最多的是127.0.0.1。</p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214115539456.png" alt="image-20201214115539456"></p>
</li>
<li><p><strong>ICMP协议(Internet Control Message Protocol，因特网控制报文协议)</strong></p>
</li>
<li><p><strong>ARP协议（Address Resolution Protocol，地址解析协议）</strong></p>
<p>从网络层使用IP地址，解析出数据链路层使用的硬件地址（由IP地址解析出硬件地址）</p>
<p>当主机A预向本局域网上的某个主机B发送IP数据报时，就先其ARP高速缓存中查看有无主机B的IP地址。</p>
<ul>
<li>有，就可查出其对应的硬件地址，再将此硬件地址写入MAC帧，然后通过局域网将该MAC帧发往此硬件地址。</li>
<li>没有，ARP进程在本局域网上广播发送一个ARP请求分组。收到ARP响应分组后，将得到IP地址到硬件地址的映射写入ARP高速缓存。</li>
</ul>
</li>
<li><p><strong>RARP协议（Reverse Address Resolution Protocol，逆地址解析协议）</strong></p>
</li>
</ul>
<h4 id="传输层"><a href="#传输层" class="headerlink" title="传输层"></a>传输层</h4><p><strong>TCP/IP协议是Internet最基本的协议、Internet国际互联网络的基础，由网络层的IP协议和传输层的TCP协议组成。通俗而言：TCP负责发现传输的问题，一有问题就发出信号，要求重新传输，直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。</strong></p>
<h5 id="TCP"><a href="#TCP" class="headerlink" title="TCP"></a>TCP</h5><p>TCP 是一种可靠的协议，它能够保证数据包的可靠性交付，TCP 能够正确处理传输过程中的丢包、传输顺序错乱等异常情况。此外，TCP 还提供拥塞控制用于缓解网络拥堵。</p>
<p><strong>TCP报文首部格式：</strong></p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214135505549.png" alt="image-20201214135505549"></p>
<p><strong>三次握手</strong></p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214135909598.png" alt="image-20201214135909598"></p>
<ul>
<li>建立连接时，客户端发送syn包（syn=j）到服务器，并进入SYN_SENT状态，等待服务器确认；SYN：同步序列编号（Synchronize Sequence Numbers）。</li>
<li>服务器收到syn包，必须确认客户的SYN（ack=j+1），同时自己也发送一个SYN包（syn=k），即SYN+ACK包，此时服务器进入SYN_RECV状态；</li>
<li>客户端收到服务器的SYN+ACK包，向服务器发送确认包ACK(ack=k+1），此包发送完毕，客户端和服务器进入ESTABLISHED（TCP连接成功）状态，完成三次握手。</li>
</ul>
<p><strong>总结:</strong> 因为TCP面向连接，可靠的，3次足以满足一个安全连接请求和应答。clinet发出第一个连接请求报文段并没有丢失，而是在某个网络节点长时间堵塞，以致于延误连接释放以后某个时间点才到达server端，server端以为是clinet发送新请求，像客户端发送确认报文，如果不建立3次连接，只要客户端发送确认报文就建立连接，并一直等待clinet发来的数据，这样server端资源就被占用浪费了。</p>
<p><strong>4次挥手</strong></p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214141613712.png" alt="image-20201214141613712"></p>
<blockquote>
<p>1）客户端进程发出连接释放报文，并且停止发送数据。释放数据报文首部，FIN=1，其序列号为seq=u（等于前面已经传送过来的数据的最后一个字节的序号加1），此时，客户端进入FIN-WAIT-1（终止等待1）状态。 TCP规定，FIN报文段即使不携带数据，也要消耗一个序号。<br>2）服务器收到连接释放报文，发出确认报文，ACK=1，ack=u+1，并且带上自己的序列号seq=v，此时，服务端就进入了CLOSE-WAIT（关闭等待）状态。TCP服务器通知高层的应用进程，客户端向服务器的方向就释放了，这时候处于半关闭状态，即客户端已经没有数据要发送了，但是服务器若发送数据，客户端依然要接受。这个状态还要持续一段时间，也就是整个CLOSE-WAIT状态持续的时间。<br>3）客户端收到服务器的确认请求后，此时，客户端就进入FIN-WAIT-2（终止等待2）状态，等待服务器发送连接释放报文（在这之前还需要接受服务器发送的最后的数据）。<br>4）服务器将最后的数据发送完毕后，就向客户端发送连接释放报文，FIN=1，ack=u+1，由于在半关闭状态，服务器很可能又发送了一些数据，假定此时的序列号为seq=w，此时，服务器就进入了LAST-ACK（最后确认）状态，等待客户端的确认。<br>5）客户端收到服务器的连接释放报文后，必须发出确认，ACK=1，ack=w+1，而自己的序列号是seq=u+1，此时，客户端就进入了TIME-WAIT（时间等待）状态。注意此时TCP连接还没有释放，必须经过2∗∗MSL（最长报文段寿命）的时间后，当客户端撤销相应的TCB后，才进入CLOSED状态。<br>6）服务器只要收到了客户端发出的确认，立即进入CLOSED状态。同样，撤销TCB后，就结束了这次的TCP连接。可以看到，服务器结束TCP连接的时间要比客户端早一些。</p>
</blockquote>
<p><strong>总结：</strong> TCP面向连接，可靠的，断开连接需要双方都同意，才能断开连接。所以满足条件需要4次。</p>
<h5 id="UDP"><a href="#UDP" class="headerlink" title="UDP"></a>UDP</h5><p>UDP用户数据报协议,是面向无连接的通讯协议，UDP数据包括目的端口号和源端口号信息，由于通讯不需要连接，所以可以实现广播发送。</p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214142941374.png" alt="image-20201214142941374"></p>
<p><strong>TCP</strong> <strong>与</strong> <strong>UDP</strong> <strong>的区别：TCP是面向连接的，可靠的字节流服务；UDP是面向无连接的，不可靠的数据报服务。</strong></p>
<h4 id="应用层"><a href="#应用层" class="headerlink" title="应用层"></a>应用层</h4><p>在TCP/IP协议簇中，将OSI标准模型中的会话层，表示层都归为了应用层。应用层的架构大多属于客户端/服务端，提供服务的程序叫做服务端，接受服务的程序就做客户端。在这种架构中，服务端通常会提前部署到服务器上，等待客户端连接，从而提供服务。</p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214161849711.png" alt="image-20201214161849711"></p>
<h3 id="传输过程"><a href="#传输过程" class="headerlink" title="传输过程"></a>传输过程</h3><h4 id="数据包结构"><a href="#数据包结构" class="headerlink" title="数据包结构"></a>数据包结构</h4><p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214162007978.png" alt="image-20201214162007978"></p>
<p>每一分层中，都会对所发送的数据增加一个首部，这个首部中包含该层必要的信息。每一层都会对数据进行处理并在数据包中附上这一层的必要信息。</p>
<h4 id="数据包发送历程"><a href="#数据包发送历程" class="headerlink" title="数据包发送历程"></a>数据包发送历程</h4><p>假设主机 A 和主机 B 进行通信，主机 A 想要向主机 B 发送一个数据包，都会经历哪些奇特的操作？</p>
<p><strong>1、应用层的处理</strong></p>
<p>主机 A 也就是用户点击了某个应用或者打开了一个聊天窗口输入了<code>cxuan</code>，然后点击了发送，那么这个 cxuan 就作为一个数据包遨游在了网络中，等下还没完呢，应用层还需要对这个数据包进行处理，包括字符编码、格式化等等，这一层其实是 OSI 中表现层做的工作，只不过在 TCP/IP 协议中都归为了应用层。</p>
<p>数据包在发送的那一刻建立 TCP 连接，这个连接相当于通道，在这之后其他数据包也会使用通道传输数据。</p>
<p><strong>2、传输层处理</strong></p>
<p>为了描述信息能准确的到达另一方，我们使用 TCP 协议来进行描述。TCP 会根据应用的指示，负责建立连接、发送数据和断开连接。</p>
<p>TCP 会在应用数据层的前端附加一个 TCP 首部字段，TCP 首部包含了<code>源端口号</code> 和 <code>目的端口号</code>，这两个端口号用于表明数据包是从哪里发出的，需要发送到哪个应用程序上；TCP 首部还包含<code>序号</code>，用以表示该包中数据是发送端整个数据中第几个字节的序列号；TCP 首部还包含 <code>校验和</code>，用于判断数据是否损坏，随后将 TCP 头部附加在数据包的首部发送给 IP。</p>
<p><strong>3、网络层处理</strong></p>
<p>网络层主要负责处理数据包的是 IP 协议，IP 协议将 TCP 传过来的 TCP 首部和数据结合当作自己的数据，并在 TCP 首部的前端加上自己的 IP 首部。因此，IP 数据包后面会紧跟着 TCP 数据包，后面才是数据本身。IP 首部包含目的和源地址，紧随在 IP 首部的还有用来判断后面是 TCP 还是 UDP 的信息。</p>
<p>IP 包生成后，会由路由控制表判断应该发送至哪个主机，IP 修饰后的数据包继续向下发送给路由器或者网络接口的驱动程序，从而实现真正的数据传输。</p>
<p><strong>4、通信链路层处理</strong></p>
<p>经由 IP 传过来的数据包，以太网会给数据附上以太网首部并进行发送处理。以太网首部包含接收端的 MAC 地址、发送端的 MAC 地址以及标志以太网类型的以太网数据协议等</p>
<h4 id="数据包接收历程"><a href="#数据包接收历程" class="headerlink" title="数据包接收历程"></a>数据包接收历程</h4><p><strong>1、通信链路的解析</strong></p>
<p>目标主机收到数据包后，首先会从以太网的首部找到MAC地址判断是否是发给自己的数据包，如果不是发给自己的数据包则会丢弃该数据包。</p>
<p>如果收到的数据包是发送给自己，就会查以太网类型判断是哪种协议，如果是IP协议就扔给IP协议进行处理，如果是ARR协议就扔给ARP协议进行处理。如果协议无法识别，就丢弃。</p>
<p><strong>2、网络层的解析</strong></p>
<p>经过以太网处理后的数据包扔给网络层处理，我们假设协议类型是IP协议，那么在IP收到数据包后就会解析IP首部，判断IP首部中IP地址是不是与自己匹配，如果匹配接收并判断上一层协议是TCP或者UDP,不匹配直接丢弃。</p>
<blockquote>
<p>注意：在路由转发的过程中，有的时候 IP 地址并不是自己的，这个时候需要借助路由表协助处理</p>
</blockquote>
<p><strong>3、传输层的处理</strong></p>
<p>在传输层中，我们默认使用TCP协议，在TCP处理过程中，首先会计算一下校验和，判断数据是否被损坏。然后检测是否按照序号接收数据，最后检查端口号，确定是哪个应用程序。数据被完整的识别，会传递给由端口号识别的应用程序进行处理。</p>
<p><strong>4、应用程序的处理</strong></p>
<p>接收端指定的应用程序会处理发送方传递过来的数据，通过解码等操作识别出数据的内容，然后把对应的数据存储在磁盘上，返回一个保存成功的消息给发送方，如果保存失败，则返回错误消息。</p>
<p><strong>下面是完整的处理过程和解析过程</strong></p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214164505242.png" alt="image-20201214164505242"></p>
<p><strong>数据包经过每层后，该层协议都会在数据包附上包首部，一个完整的包首部图如下所示</strong></p>
<p><img src="https://jameslin23.gitee.io/2020/12/14/TCP-IP/image-20201214164638295.png" alt="image-20201214164638295"></p>

      
    </div>
    <footer class="article-footer">
      
        <div id="donation_div"></div>

<script src="/js/vdonate.js"></script>
<script>
var a = new Donate({
  title: '如果觉得我的文章对您有用，请随意打赏。您的支持将鼓励我继续创作!', // 可选参数，打赏标题
  btnText: '打赏支持', // 可选参数，打赏按钮文字
  el: document.getElementById('donation_div'),
  wechatImage: 'https://raw.githubusercontent.com/iTimeTraveler/iTimeTraveler.github.io/site/source/about/donate/images/WeChanQR.png',
  alipayImage: 'https://raw.githubusercontent.com/iTimeTraveler/iTimeTraveler.github.io/site/source/about/donate/images/AliPayQR.jpg'
});
</script>
      
      
      <div>
        <ul class="post-copyright">
          <li class="post-copyright-author">
          <strong>本文作者:  </strong>LeBron Tao
          </li>
          <li class="post-copyright-link">
          <strong>本文链接:  </strong>
          <a href="/2020/12/14/TCP-IP/" target="_blank" title="TCP-IP">https://jameslin23.gitee.io/2020/12/14/TCP-IP/</a>
          </li>
          <li class="post-copyright-license">
            <strong>版权声明:   </strong>
            本博客所有文章除特别声明外，均采用 <a rel="license" href="https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank" title="Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)">CC BY-NC-ND 4.0</a>
            许可协议。转载请注明出处
          </li>
         
        </ul>
<div>
</div></div>
      
      
        
	<div id="comment">
		<!-- 来必力City版安装代码 -->
		<div id="lv-container" data-id="city" data-uid="MTAyMC8yOTQ4MS82MDQ5">
		<script type="text/javascript">
		   (function(d, s) {
		       var j, e = d.getElementsByTagName(s)[0];

		       if (typeof LivereTower === 'function') { return; }

		       j = d.createElement(s);
		       j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
		       j.async = true;

		       e.parentNode.insertBefore(j, e);
		   })(document, 'script');
		</script>
		<noscript>为正常使用来必力评论功能请激活JavaScript</noscript>
		</div>
		<!-- City版安装代码已完成 -->
	</div>



      
      
        
  <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/计算机网络/">计算机网络</a></li></ul>

      

    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/2020/12/15/http核心技术/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">上一篇</strong>
      <div class="article-nav-title">
        
          http核心技术
        
      </div>
    </a>
  
  
    <a href="/2020/12/12/平衡二叉搜索树/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">下一篇</strong>
      <div class="article-nav-title">平衡二叉搜索树</div>
    </a>
  
</nav>

  
</article>

<!-- Table of Contents -->

  <aside id="toc-sidebar">
    <div id="toc" class="toc-article">
    <strong class="toc-title">文章目录</strong>
    
        <ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#OSI标准模型"><span class="nav-number">1.</span> <span class="nav-text">OSI标准模型</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#TCP-IP体系"><span class="nav-number">2.</span> <span class="nav-text">TCP/IP体系</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#各层定义"><span class="nav-number">2.1.</span> <span class="nav-text">各层定义</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#通信链路层"><span class="nav-number">2.1.1.</span> <span class="nav-text">通信链路层</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#网络层"><span class="nav-number">2.1.2.</span> <span class="nav-text">网络层</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#传输层"><span class="nav-number">2.1.3.</span> <span class="nav-text">传输层</span></a><ol class="nav-child"><li class="nav-item nav-level-5"><a class="nav-link" href="#TCP"><span class="nav-number">2.1.3.1.</span> <span class="nav-text">TCP</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#UDP"><span class="nav-number">2.1.3.2.</span> <span class="nav-text">UDP</span></a></li></ol></li><li class="nav-item nav-level-4"><a class="nav-link" href="#应用层"><span class="nav-number">2.1.4.</span> <span class="nav-text">应用层</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#传输过程"><span class="nav-number">2.2.</span> <span class="nav-text">传输过程</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#数据包结构"><span class="nav-number">2.2.1.</span> <span class="nav-text">数据包结构</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#数据包发送历程"><span class="nav-number">2.2.2.</span> <span class="nav-text">数据包发送历程</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#数据包接收历程"><span class="nav-number">2.2.3.</span> <span class="nav-text">数据包接收历程</span></a></li></ol></li></ol></li></ol>
    
    </div>
  </aside>

</section>
        
      </div>
      
      <footer id="footer">
  

  <div class="container">
      	<div class="row">
	      <p> Powered by <a href="http://hexo.io/" target="_blank">Hexo</a> and <a href="https://github.com/iTimeTraveler/hexo-theme-hiker" target="_blank">Hexo-theme-hiker</a> </p>
	      <p id="copyRightEn">Copyright &copy; 2013 - 2021 JAVA All Rights Reserved.</p>
	      
	      
    		<p class="busuanzi_uv">
				访客数 : <span id="busuanzi_value_site_uv"></span> |  
				访问量 : <span id="busuanzi_value_site_pv"></span>
		    </p>
  		   
		</div>

		
  </div>
</footer>


<!-- min height -->

<script>
    var wrapdiv = document.getElementById("wrap");
    var contentdiv = document.getElementById("content");
    var allheader = document.getElementById("allheader");

    wrapdiv.style.minHeight = document.body.offsetHeight + "px";
    if (allheader != null) {
      contentdiv.style.minHeight = document.body.offsetHeight - allheader.offsetHeight - document.getElementById("footer").offsetHeight + "px";
    } else {
      contentdiv.style.minHeight = document.body.offsetHeight - document.getElementById("footer").offsetHeight + "px";
    }
</script>
    </div>
    <!-- <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
    <a href="/categories" class="mobile-nav-link">Categories</a>
  
    <a href="/tags" class="mobile-nav-link">Tags</a>
  
    <a href="/about" class="mobile-nav-link">About</a>
  
</nav> -->
    

<!-- mathjax config similar to math.stackexchange -->

<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    tex2jax: {
      inlineMath: [ ['$','$'], ["\\(","\\)"] ],
      processEscapes: true
    }
  });
</script>

<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
      tex2jax: {
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
      }
    });
</script>

<script type="text/x-mathjax-config">
    MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax(), i;
        for(i=0; i < all.length; i += 1) {
            all[i].SourceElement().parentNode.className += ' has-jax';
        }
    });
</script>

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>


  <link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
  <script src="/fancybox/jquery.fancybox.pack.js"></script>


<script src="/js/scripts.js"></script>




  <script src="/js/dialog.js"></script>








	<div style="display: none;">
    <script src="https://s95.cnzz.com/z_stat.php?id=1260716016&web_id=1260716016" language="JavaScript"></script>
  </div>



	<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js">
	</script>






  </div>

  <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h2 class="modal-title" id="myModalLabel">设置</h2>
      </div>
      <hr style="margin-top:0px; margin-bottom:0px; width:80%; border-top: 3px solid #000;">
      <hr style="margin-top:2px; margin-bottom:0px; width:80%; border-top: 1px solid #000;">


      <div class="modal-body">
          <div style="margin:6px;">
            <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne" onclick="javascript:setFontSize();" aria-expanded="true" aria-controls="collapseOne">
              正文字号大小
            </a>
          </div>
          <div id="collapseOne" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
          <div class="panel-body">
            您已调整页面字体大小
          </div>
        </div>
      


          <div style="margin:6px;">
            <a data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" onclick="javascript:setBackground();" aria-expanded="true" aria-controls="collapseTwo">
              夜间护眼模式
            </a>
        </div>
          <div id="collapseTwo" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTwo">
          <div class="panel-body">
            夜间模式已经开启，再次单击按钮即可关闭 
          </div>
        </div>

        <div>
            <a data-toggle="collapse" data-parent="#accordion" href="#collapseThree" aria-expanded="true" aria-controls="collapseThree">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关 于&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
        </div>
         <div id="collapseThree" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingThree">
          <div class="panel-body">
            JAVA
          </div>
          <div class="panel-body">
            Copyright © 2021 LeBron Tao All Rights Reserved.
          </div>
        </div>
      </div>


      <hr style="margin-top:0px; margin-bottom:0px; width:80%; border-top: 1px solid #000;">
      <hr style="margin-top:2px; margin-bottom:0px; width:80%; border-top: 3px solid #000;">
      <div class="modal-footer">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
      </div>
    </div>
  </div>
</div>
  
  <a id="rocket" href="#top" class=""></a>
  <script type="text/javascript" src="/js/totop.js?v=1.0.0" async=""></script>
  
    <a id="menu-switch"><i class="fa fa-bars fa-lg"></i></a>
  
</body>
</html>